#include "readfiles.h"
#include "QFile"
#include "QDebug"
#include "QRegularExpression"
ReadFiles::ReadFiles() {

}

ReadFiles::~ReadFiles()
{

}

/**
 * 作者：whb
 * 日期：2025年4月22日
 * @brief 从文本文件读取两列数据到输出列表
 * @param filePath 文件路径
 * @param[out] x 存储第一列数据的输出列表
 * @param[out] y 存储第二列数据的输出列表
 * @return 是否成功读取
 */
bool ReadFiles::readtxtFile(const QString &filePath, QList<double>& x, QList<double>& y)
{
    // 清空输出列表以确保数据纯净
    x.clear();
    y.clear();

    QFile file(filePath);
    if (!file.open(QIODevice::ReadOnly  | QIODevice::Text)) {
        qWarning() << "无法打开文件:" << filePath<< "错误:" << file.errorString();
        return false;
    }

    QTextStream in(&file);
    int lineNumber = 0;
    bool hasError = false;

    while (!in.atEnd())  {
        lineNumber++;
        QString line = in.readLine().trimmed();

        // 跳过空行和注释行（以#开头）
        if (line.isEmpty()  || line.startsWith('#'))  {
            continue;
        }

        // 使用正则表达式分割可能包含空格的数据
        QStringList columns = line.split(QRegularExpression("\\s*,\\s*"),  Qt::SkipEmptyParts);

        // 验证数据列数
        if (columns.size()  != 2) {
            qWarning() << "第" << lineNumber << "行数据格式错误，需要两列数据"<< "实际内容:" << line;
            hasError = true;
            continue;
        }

        // 转换数据并验证有效性
        bool ok1, ok2;
        double val1 = columns[0].toDouble(&ok1);
        double val2 = columns[1].toDouble(&ok2);

        if (!ok1 || !ok2) {
            qWarning() << "第" << lineNumber << "行包含非数值数据"<< "内容:" << line;
            hasError = true;
            continue;
        }

        x.append(val1);
        y.append(val2);
    }

    file.close();

    // 验证是否读取到有效数据
    if (x.isEmpty())  {
        qWarning() << "文件未包含有效数据:" << filePath;
        return false;
    }

    qDebug() << "成功读取" << x.size()  << "条数据 from:" << filePath;
    return !hasError;
}
